#include <stdio.h>

#define N 5 // 在接下来的程序中，把 N 当成 5 来用

int main(int argc, char const *argv[])
{
  /* code */
  // 一、传统 C++ 如何处理输入和输出
  // scanf - 处理从键盘输入
  int a = 0, b = 0;
  // %d - 表示整数
  scanf("%d %d"/*内容模板*/, &a, &b/*输入变量*/);

  // printf - 处理打印到屏幕
  // \n - endl
  printf("a=%d b=%d\n", a, b);

  // %c - char
  // 65 = 'A'
  // 97 = 'a'
  // 48 = '0'
  char c = 'A';
  printf("c = %c\n", c);
  printf("c = %d\n", c); // ASCII 码
  printf("a = %d\n", 'a');
  printf("0 = %d\n", '0');

  // 二、传统 C++ 中的数组
  // vector<int> / vector<char> / vector<bool>
  // 元素的类型 数组变量的名字[数组元素的个数]
  // 数组元素的个数，不能是变量
  int numbers[N] = {1, 2, 3, 4, 5}; // 不能添加元素，不能删除元素，能保存元素
  char chars[N] = {'A', 'B', 'C', 'D', 'E'};
  // ...

  for (int i = 0; i < N; ++i) {
    printf("%d ", numbers[i]);
  }
  printf("\n");
  return 0;

  // 三、宏
  // 宏就是某一个值的别名
  // #define

  // 四、字符串
  // <string> string s {"Hello"}
  // 4.1 字符串的字面量（字符串的内容）
  // 我们不能修改 greetings 的值
  const char *greetings = "Hello";
  // 4.2 字符串变量
  char s[] = "Hello";
  char s1[8] = "Hello"; // 'H', 'e', 'l', 'l', 'o', '\0', '\0', '\0'
  // C++ 会自动在字符串的末尾添加一个 '\0'，字符串终结符。

  char name[] = "abc\0abc";
  printf("name = %s\n", name); // name = abc

  // 五、十进制和二进制的转换
  // 5.1 2 -> 10
  // 0b1000
  // 1*2^3  +  0*2^2  +   0*2^1  +   0*2^0 = 8
  // 把每一个二进制位乘以 2^(位数-1)
  int b0 = 0b10000; // 16
  int b1 = 0b1000;  // 8
  int b2 = 0b0100;  // 4
  int b3 = 0b0010;  // 2
  int b4 = 0b0001;  // 1

  int b5 = 0b1011; // 1000 -> 8 + 2 + 1 = 11
  int b6 = 0b0111; // 7
  int b7 = 0b1111; // 15

  // 二进制的加法 0b1111 + 0b0001
  // 0 + 0 = 0 | 1 + 0 = 1 | 0 + 1 = 1 | 1 + 1 = 10
  // 0b101 + 0b110 = 0b1011
  // 0b11 + 0b01 = 0b100
  // 0b11 + 0b11 = 0b110
  // 0b1111 + 0b0001 = 0b10000

  // 5.2 10 -> 2
  // 33 = 32 + 1 = 0b100000 + 1 = 0b100001
  // 33 -> 0b100001
  //         商 余数
  // 33/2   16  1
  // 16/2   8   0
  // 8/2    4   0
  // 4/2    2   0
  // 2/2    1   0
  // 1/2    0   1
  // 17 -> 0b10001
  // 17 = 16 + 1 = 0b10000 + 1 = 0b10001
  // 20 = 16 + 4 = 0b10000 + 0b100 = 0b10100
  // 36 = 32 + 4 = 0b100000 + 0b100 = 0b100100
  // 1616 / 2

  // 六、按位操作符
  // >> 按位右移
  // 本质把数字除以 2^位移
  int b7 = 0b1000; // 8
  b7 = b7 / 4;    // b7 / 4

  /*
  0b   1000 8
  >> 1 0100 4 8 / 2^1
  >> 2 0010 2 8 / 2^2
  >> 3 0001 1 8 / 2^3
  */
}
